#include "LecteurSymbole.h"
#include <ctype.h>
#include <string.h>
#include <iostream>
using namespace std;

////////////////////////////////////////////////////////////////////////////////

LecteurSymbole::LecteurSymbole(string nomFich) :
lc(nomFich), symCour("") {
    suivant(); // pour lire le premier symbole
}

///////////////////////////////////////////////////////////////////////////////

void LecteurSymbole::suivant() {
     
      // on est maintenant positionne sur le premier caractère d'un symbole
   while (lc.getCarCour() == ' ' ||
            lc.getCarCour() == '\t' ||
            lc.getCarCour() == '\r' ||lc.getCarCour()=='#'||
            lc.getCarCour() == '\n')
      {
       sauterSeparateurs();
      sauterCommentaire();   
      }
   ligne = lc.getLigne();
    colonne = lc.getColonne();
    symCour = Symbole(motSuivant()); // on reconstruit symCour avec le nouveau mot lu

}

////////////////////////////////////////////////////////////////////////////////

void LecteurSymbole::sauterSeparateurs() {
    while (lc.getCarCour() == ' ' ||
            lc.getCarCour() == '\t' ||
            lc.getCarCour() == '\r' ||
            lc.getCarCour() == '\n')
        lc.suivant();
}

void LecteurSymbole::sauterCommentaire() {
    //Pour sauter une ligne de commentaire
     while (lc.getCarCour() == '#') // pour sauter plusieurs lignes à la suite
    {
        while (lc.getCarCour() != '\n') //pour sauter une ligne de commentaire
        {
            lc.suivant();    
        }
        sauterSeparateurs(); // on se place en début de ligne suivante
    }
}
////////////////////////////////////////////////////////////////////////////////

string LecteurSymbole::motSuivant() {
    static string s;
    s = "";
    if (isdigit(lc.getCarCour()))
        // c'est le début d'un entier
        do {
            s = s + lc.getCarCour();
            lc.suivant();
        } while (isdigit(lc.getCarCour()));

    else if (isalpha(lc.getCarCour()))
        // c'est le début d'un mot
        do {
            s = s + lc.getCarCour();
            lc.suivant();
        } while (isalpha(lc.getCarCour()) ||
                isdigit(lc.getCarCour()) ||
                lc.getCarCour() == '_');
    else if (lc.getCarCour() == '"') {
        //c'est le début d'une chaine!!!!!!!!

        do {
            s = s + lc.getCarCour();
            lc.suivant();
        } while (lc.getCarCour() != '"' && lc.getCarCour() != EOF);
        s = s + lc.getCarCour();
        lc.suivant();
    }
    else if (lc.getCarCour()=='=' || lc.getCarCour()=='!'
            || lc.getCarCour()=='<' || lc.getCarCour()=='>') {
        //c'est le debut d'un operateur de comparaison
        s=s+lc.getCarCour();
        lc.suivant();
        if (lc.getCarCour()=='=') {
            s=s+lc.getCarCour();
            lc.suivant();
        }

    else if (lc.getCarCour() != EOF)
        // c'est un caractere special
    {
        s = lc.getCarCour();
        lc.suivant();
    }
    return s;
}

}